class C:

    def __init__(self, x):
        self.x = x


# 传入一个类
print(type(C))  # <class 'type'>
print(type(type))  # <class 'type'>

# type 就是根，是 Python 万物的起点
#  Python 万物皆对象，包括生成对象的类以及自身都是对象


# 函数概述：
# type() 函数根据参数的不同，有两种不同的用法：
# 第一种是根据 object 参数的类型，返回值是一个 type 对象，通常与 object__class__ 所返回的对象相同
# 第二种是根据传入的三个参数，返回一个新的 type 对象


# 函数解析：
# 我们不推荐使用 type 函数来检测对象的类型，推荐使用 isinstance() 函数来检测，因为后者会考虑子类的情况
# 对于第二种用法，本质上是 class 定义类语句的一种动态形式，
# name 参数即类名，并将其赋值给 __name__ 属性，
# bases 参数指定其父类，并赋值给 __bases__ 属性（如果该参数为空则默认指定 object 为父类）,
# dict 参数指定包含类主体的属性和方法的定义，它在赋值给 __dict__ 属性之前可能会被拷贝或装饰

# class X:
#     a = 1
# 使用 type 函数创建上面的 X 类
X = type('X', (), dict(a=1))

print("=============================================================================")

# class C:
#     pass
C = type('C', (), {})
# 查看类的父类
print(C.__bases__)  # (<class 'object'>,)

c = C()
# 查询该对象的类型
print(c.__class__)  # <class '__main__.C'>

print("=============================================================================")

# 创建类D，继承自类C
# 第二个参数要求是元组类型，所以我们在后面加上一个逗号
D = type('D', (C,), {})
print(D.__bases__)  # (<class '__main__.C'>,)

print("=============================================================================")

# 创建一个带属性的类
E = type('E', (), dict(x=250, y=520))
print(E.x)
print(E.y)

print("=============================================================================")


# 创建一个带函数的类

def func(self, name='FishC'):
    print(f"Hello {name}")


F = type('F', (), dict(say_hi=func))
f = F()
f.say_hi()  # Hello FishC

